package com.demo.openpdfdemo.pdfCreator.core;


import com.lowagie.text.Chunk;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.html.simpleparser.HTMLWorker;
import com.lowagie.text.html.simpleparser.StyleSheet;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPRow;
import com.lowagie.text.pdf.PdfPTable;
import org.springframework.util.CollectionUtils;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 实现对html片段解析为Document中所需的Element信息
 */
public class HtmlParserUtil {
    /**
     * 实现对html片段解析
     *
     * @param html html代码
     * @param font 字体
     * @return List<Element>
     * @throws IOException IO操作异常
     */
    public static List<Element> htmlParseToElementList(String html, Font font) throws IOException {
        if (!"".equals(html)) {
            //字符流
            StringReader stringReader = new StringReader(html);
            //用于存放字体样式实现类，这里为空即可，通过测试，发现用其他字体无法正常中文，故这里需要进行对baseFont重新定义
            Map<String, Object> map = new HashMap<>();
//            map.put("font_factory", new FontFactoryImp());
            List<Element> elements = HTMLWorker.parseToList(stringReader, new StyleSheet(), map);
            if (!CollectionUtils.isEmpty(elements)) {
                //解析数据获取具体的element
                List<Element> chunks = new ArrayList<>();
                for (Element element : elements) {
                    if (element instanceof com.lowagie.text.List) {
                        com.lowagie.text.List list = (com.lowagie.text.List) element;
                        chunks.addAll(list.getChunks());
                    } else if (element instanceof PdfPTable) {
                        PdfPTable pdfPTable = (PdfPTable) element;
                        ArrayList<PdfPRow> rows = pdfPTable.getRows();
                        for (PdfPRow row : rows) {
                            for (PdfPCell cell : row.getCells()) {
                                List<Element> compositeElements = cell.getCompositeElements();
                                for (Element e : compositeElements) {
                                    chunks.addAll(e.getChunks());
                                }
                            }
                        }
                    } else {
                        chunks.addAll(element.getChunks());
                    }
                }
                if (!CollectionUtils.isEmpty(chunks)) {
                    //将所有的Font的BaseFont重新定义，Font跟pdf其他元素一样即可，其他的是正常显示的。
                    //目前没有找到跟Itext一样的全局设置的接口，只能检索每个元素重新设置字体
                    for (Element chunk : chunks) {
                        if (chunk instanceof Chunk) {
                            Font chunkFont = ((Chunk) chunk).getFont();
                            Font newFont = new Font(font.getBaseFont(), chunkFont.getSize(), chunkFont.getStyle(), chunkFont.getColor());
                            ((Chunk) chunk).setFont(newFont);
                        }
                    }
                }
            }
            return elements;
        }
        return new ArrayList<>();
    }
}
